﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace FlyShop
{
    public partial class FrmCadastroAeroporto : Form
    {

        // Indica se o form está em modo de edição
        public bool edicao = false;

        // Código do registro a ser alterado
        public int codAeroporto = 0;

        OleDbConnection conexao;
        OleDbCommand comando;
        OleDbDataReader dr;
        ArrayList listaCidades = new ArrayList();
        String strConexao = "Provider=MSDAORA.1;Data Source=localhost;Persist Security Info=True;User ID=pi;Password=pi";
        String sqlInsere = "insert into aeroporto (cod_aeroporto, nome, cod_cidade) values ((select nvl(max(cod_aeroporto), 0) + 1 from aeroporto), ?, ?)";
        String sqlUpdate = "update aeroporto set nome = ?, cod_cidade = ? where cod_aeroporto = ?";
        String sqlConsulta = "select aeroporto.*, cidade.* from aeroporto inner join cidade on aeroporto.cod_cidade = cidade.cod_cidade where aeroporto.cod_aeroporto = ?";
        String sqlConsultaCidadesUF = "select * from cidade where uf = ?";
        OleDbParameter pCod, pNome, pCodCidade, pUF;

        public FrmCadastroAeroporto()
        {
            InitializeComponent();
        }

        private void FrmCadastroAeroporto_Load(object sender, EventArgs e)
        {
            conexao = new OleDbConnection(strConexao);
            conexao.Open();


            // Se estiver em modo edição, recupera o registro
            // no banco e mostra-o no formulário
            if (edicao)
            {

                comando = new OleDbCommand(sqlConsulta, conexao);

                pCod = new OleDbParameter("cod_aeroporto", OleDbType.Integer);
                pCod.Value = codAeroporto;
                comando.Parameters.Add(pCod);

                dr = comando.ExecuteReader();

                if (dr.Read())
                {
                    txtNome.Text = dr["nome"].ToString();
                    cbUF.SelectedItem = dr["uf"];

                    // Simula uma seleção na combo de estados, assim a combo de cidades será populada
                    cbEstado_SelectionChangeCommitted(new Object(), new EventArgs());

                    // Seleciona a cidade na combo
                    cbCidade.SelectedValue = dr["cod_cidade"];

                }
                else
                {
                    MessageBox.Show("Erro - Edição?");
                    this.Close();
                }

            }

        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            if (valida())
            {

                // Cria o comando de acordo o estado do formulário
                if (edicao)
                {
                    comando = new OleDbCommand(sqlUpdate, conexao);

                    // Parâmetros
                    pNome = new OleDbParameter("nome", OleDbType.VarChar);
                    pNome.Value = txtNome.Text.Trim();
                    comando.Parameters.Add(pNome);

                    pCodCidade = new OleDbParameter("cod_cidade", OleDbType.Integer);
                    pCodCidade.Value = cbCidade.SelectedValue;
                    comando.Parameters.Add(pCodCidade);

                   
                    pCod = new OleDbParameter("cod_aeroporto", OleDbType.Integer);
                    pCod.Value = codAeroporto;
                    comando.Parameters.Add(pCod);

                    // Update
                    comando.ExecuteNonQuery();

                    // Fecha o formulário quando é edição
                    this.Close();
                }
                else
                {

                    comando = new OleDbCommand(sqlInsere, conexao);

                    // Parâmetros
                    pNome = new OleDbParameter("nome", OleDbType.VarChar);
                    pNome.Value = txtNome.Text.Trim();
                    comando.Parameters.Add(pNome);

                    pCodCidade = new OleDbParameter("cod_cidade", OleDbType.Integer);
                    pCodCidade.Value = cbCidade.SelectedValue;
                    comando.Parameters.Add(pCodCidade);

                    // Insert
                    comando.ExecuteNonQuery();


                    // Verifica se o usuário deseja inserir um novo registro
                    DialogResult resultado = MessageBox.Show(this,
                                                           "Cadastrado com sucesso.\nDeseja cadastrar outro registro?",
                                                           "Cadastro",
                                                            MessageBoxButtons.YesNo);

                    if (resultado == DialogResult.Yes)
                    {
                        // Limpa os campos
                        txtNome.Clear();
                        cbCidade.SelectedItem = null;
                        cbUF.SelectedItem = null;
                    }
                    else
                    {
                        this.Close();
                    }

                }
            }

        }

 

        public bool valida()
        {
            String nome = txtNome.Text.Trim();
            if (nome.Length < 3 || nome.Length > 100)
            {
                MessageBox.Show(this, "Preencha o nome corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtNome.Focus();
                txtNome.BackColor = Color.Tomato;
                return false;
            }
            else
                txtNome.BackColor = Color.White;

            if (cbUF.SelectedItem == null)
            {
                MessageBox.Show(this, "Preencha a unidade federativa corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }

            if (cbCidade.SelectedItem == null) 
            {
                MessageBox.Show(this, "Preencha a cidade corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            
            // Se chegar aqui validou
            return true;
        }


        private void FrmCadastroAeroporto_FormClosed(object sender, FormClosedEventArgs e)
        {
            conexao.Close();
        }

        private void cbEstado_SelectionChangeCommitted(object sender, EventArgs e)
        {
            // Quando ocorrer uma seleção na combo de estados
            // alimenta a combo de cidades de acordo com o estado selecionado
            comando = new OleDbCommand(sqlConsultaCidadesUF, conexao);
            
            pUF = new OleDbParameter("uf", OleDbType.VarChar);
            pUF.Value = cbUF.SelectedItem;
            comando.Parameters.Add(pUF);

            // Select
            dr = comando.ExecuteReader();

            if (dr.HasRows)
            {
                ArrayList cidadesUF = new ArrayList();
                while (dr.Read())
                {
                    cidadesUF.Add(new { 
                        nomeCidade = dr["nome"],
                        codCidade = dr["cod_cidade"]
                    });
                }

                cbCidade.ValueMember = "codCidade";
                cbCidade.DisplayMember = "nomeCidade";
                cbCidade.DataSource = cidadesUF;
            }
            else
            {
                cbCidade.DataSource = null;
            }


        }

        private void FrmCadastroAeroporto_KeyDown(object sender, KeyEventArgs e)
        {
            //Hotkey para salvar os dados
            if (e.KeyData == (Keys.Control | Keys.S))
            {
                btnSalvar_Click(sender, e);
            }

            //Hotkey para a tecla ESC fechar a janela
            if (e.KeyData == (Keys.Escape))
            {
                this.Close();
            }
        }
    }
}
